package com.tyros.common.kit.json;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tyros.common.kit.log.LogKit;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

/**
 * @author zhangshuaiyin
 * @date 2022/5/30 16:58
 */
@Slf4j
public class JacksonKit {
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    static {
        // 反序列为bean时，忽略不存在属性，不然会报错
        OBJECT_MAPPER.configure(JsonParser.Feature.IGNORE_UNDEFINED, true);
        // Include.Include.ALWAYS 默认
        // Include.NON_DEFAULT 属性为默认值不序列化
        // Include.NON_EMPTY 属性为 空（“”） 或者为 NULL 都不序列化
        // Include.NON_NULL 属性为NULL 不序列化
        // 注意map不起作用
        OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    }

    /**
     * 对象转json字符串
     *
     * @param obj 对象
     * @return JSON字符串
     */
    public static String toJson(Object obj) {
        try {
            return OBJECT_MAPPER.writeValueAsString(obj);
        } catch (JsonProcessingException e) {
            log.error(ExceptionUtils.getStackTrace(e));
        }
        return null;
    }

    /**
     * JSON字符串转对象
     *
     * @param src 字符串
     * @param clz 对象class
     * @return 对象
     */
    public static <T> T toObject(String src, Class<T> clz) {
        try {
            return OBJECT_MAPPER.readValue(src, clz);
        } catch (JsonProcessingException e) {
            log.error(ExceptionUtils.getStackTrace(e));
        }
        return null;
    }

    /**
     * 对象转base64 json字符串
     *
     * @param obj 对象
     * @return Base64 JSON字符串
     */
    public static String toJsonBase64(Object obj) {
        try {
            return Base64.getEncoder().encodeToString(OBJECT_MAPPER.writeValueAsString(obj).getBytes(StandardCharsets.UTF_8));
        } catch (JsonProcessingException e) {
            LogKit.error(log, ExceptionUtils.getStackTrace(e));
        }
        return null;
    }

    /**
     * Base64 JSON字符串转对象
     *
     * @param src Base64 JSON字符串
     * @param clz 对象class
     * @return 对象
     */
    public static <T> T base64ToObject(String src, Class<T> clz) {
        try {
            return OBJECT_MAPPER.readValue(Base64.getDecoder().decode(src.getBytes(StandardCharsets.UTF_8)), clz);
        } catch (IOException e) {
            LogKit.error(log, ExceptionUtils.getStackTrace(e));
        }
        return null;
    }
}
